package com.example.demo.serivce;

import com.example.demo.Mapper.UserMapper;
import com.example.demo.pojo.Role;
import com.example.demo.pojo.User;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;

import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**   使用步骤：
 *      继承 UserDetailsService 实现 loadUserByUsername方法
 *      username参数就是我们前端页面传入过来的用户名
 *      根据用户名去查询 用户的信息
 *      最后把user对象返回回去
 *
 *    spring security就会自动去对比密码和用户名
 *
 *    密码加密工具类 BCryptPasswordEncoder的对象
 */
public class MyUserDetailsService implements UserDetailsService {
    @Autowired
    private UserMapper userMapper;

    private Logger logger = LoggerFactory.getLogger(getClass());

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        logger.info("用户的用户名: {}", username);
        // TODO 根据用户名，查找到对应的密码，与权限
        //根据用户名查询出我们的用户数据
         User user=userMapper.findByUsername(username);
        //获取当前用户的全部角色
         List<Integer> roleIds = userMapper.listRoleIds(user.getId());
         //创建一个角色集合
         List<Role> roleList=new ArrayList<>();
         roleIds.forEach(roleId->{
              //查询出当前用户的全部角色封装到角色集合里面去
              Role role= userMapper.listRole(roleId);
              roleList.add(role);
           });
         //设置到我们当前用户的角色里面去
          user.setRoles(roleList);
        user.setEnabled(true); //设置我们当前用户是可用的
         //最后把我们查询出来的 用户信息返回回去
        return user;
  }
}